home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Tools 4
/
Amiga Tools 4.iso
/
tools
/
wb-enhancement
/
madhouse
/
developer
/
c-demo
/
demo_german.c
next >
Wrap
C/C++ Source or Header
|
1996-02-26
|
11KB
|
392 lines
/* demo_german.c
Dies ist ein Beispiel-Blanker für Madhouse, mit deutschen Kommentaren.
Hinweisen zum kompilieren des Programms:
- Vielleicht mag Dein Compiler nicht die <pragma/...>-Includes.
Dann kannst Du diese Includes evtl. weglassen, oder "pragma" muß ge-
ändert werden.
- Dieses Programm kann mit dem MaxonC++ Version 3 problemlos übersetzt
werden. Für andere Compiler kann eine Anpassung nötig werden.
*/
#include <dos/dos.h>
#include <intuition/intuition.h>
#include <intuition/screens.h>
#include <pragma/graphics_lib.h>
#include <pragma/intuition_lib.h>
#include <pragma/exec_lib.h>
#include <pragma/dos_lib.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define ABNC 0x40
#define ABC 0x80
/* Prototypen: */
void write_stopblank();
void read_prefs();
void write_error( char *str );
/* Variablen */
char text[40];
short color, scroll;
time_t start;
short duration_sec=0;
struct Library *IntuitionBase = NULL;
struct Library *GfxBase = NULL;
struct Screen *scr = NULL;
struct Window *win = NULL;
struct Message *msg = NULL;
USHORT DemoPalette[] = {
0x0000, 0x0FFF
};
struct TextAttr topaz8 = {
"topaz.font",
8,
0,
0
};
/***************************************************************************
*** open_all()
*** Öffnet alle benötigten Dinge.
***************************************************************************/
BOOL open_all()
{
IntuitionBase = OpenLibrary("intuition.library",37);
if( !IntuitionBase ) return FALSE;
GfxBase = OpenLibrary("graphics.library",37);
if( !GfxBase ) return FALSE;
/* Einen einfachen LowRes-Screen öffnen. */
scr = OpenScreenTags(NULL,
SA_Depth, 1,
SA_Width, 320,
SA_Height, 256,
SA_Font, &topaz8,
TAG_DONE);
if(!scr) return FALSE;
/* Der Mauszeiger verschwindet, wenn man ihm die Farben des Hintergrunds
gibt: */
SetRGB4( &scr->ViewPort,17,0,0,0);
SetRGB4( &scr->ViewPort,18,0,0,0);
SetRGB4( &scr->ViewPort,19,0,0,0);
win = OpenWindowTags(NULL,
WA_AutoAdjust, TRUE,
WA_NoCareRefresh, TRUE,
WA_CustomScreen, scr,
WA_Flags, WFLG_RMBTRAP,
WA_Borderless, TRUE,
WA_Activate, TRUE,
WA_IDCMP, IDCMP_MOUSEBUTTONS+IDCMP_RAWKEY,
TAG_DONE );
if( !win ) return FALSE;
LoadRGB4( &scr->ViewPort, DemoPalette, 2 );
return TRUE;
}
/***************************************************************************
*** close_all()
*** Schließt alles, was wir geöffnet hatten.
***************************************************************************/
void close_all()
{
/* Diese Anweisung legt den Screen nach hinten. Dies verhindert einen
nervigen Effekt, wenn der Screen auf einem 68000-Amiga geschlossen
wird. */
if( scr )
ScreenToBack( scr );
/* Wenn etwas schlief lief, müssen wir das Madhouse mitteilen. Aber
weil man write_error() nur einmal aufrufen darf, benötigen wir
diese nette if-Konstruktion: */
if( !IntuitionBase ) write_error( "No intuition.lib V37!" );
else {
if( !GfxBase ) write_error( "No graphics.lib V37!" );
else {
if( !scr ) write_error( "Out of memory: Couldn't open screen.");
else {
if( !win ) write_error( "Out of memory: Couldn't open window.");
}
}
}
/* Jetzt schließen wir alles, was wir öffnen konnten. */
if( win ) CloseWindow( win );
if( scr ) CloseScreen( scr );
if( GfxBase ) CloseLibrary( GfxBase );
if( IntuitionBase ) CloseLibrary( IntuitionBase );
}
/***************************************************************************
*** main()
*** Hier steht nun endlich der richtige Blanker:
***************************************************************************/
void main()
{
BOOL quit = FALSE;
BOOL user_quit = FALSE;
short ypos = 20;
short direction = 1;
short oldy;
/* Zuerst lesen wir die Blanker-Einstellungen (aus dem BlankerPrefs-
Fenster) sowie den Duration-Wert, der angibt, wielange der Blanker
blanken darf. */
read_prefs();
/* Jetzt wird die Stopp-Uhr gestartet (zum Überprüfen des Eigen-Abbruchs) */
start = time(NULL);
/* Screen und Fenster werden geöffnet. */
if(open_all()) {
/* Je nach Einstellung bekommt der Text eine andere Farbe: */
switch( color ) {
case 0:
SetRGB4( &scr->ViewPort, 1, 15,0,0 );
break;
case 1:
SetRGB4( &scr->ViewPort, 1, 15,15,0 );
break;
case 2:
SetRGB4( &scr->ViewPort, 1, 0,0,15 );
}
/* Text-Parameter: der Text wird geschrieben. */
SetAPen( win->RPort, 1 );
Move( win->RPort, 5, ypos );
Text( win->RPort, text, ( strlen(text) > 38 ? 38 : strlen(text)) );
/* Hauptschleife. */
while( !quit ) {
/* Wenn Scroll gewählt wurde, muß der Text bewegt werden: */
if( scroll ) {
oldy = ypos;
ypos += direction;
if( (ypos > 220) || (ypos < 20) ) direction *= -1;
ClipBlit(win->RPort, 5, oldy-10, win->RPort, 5, ypos-10, 310, 20, ABNC | ABC );
/* Minterme ABNC | ABC -> Rechteck ohne Veränderungen kopieren. */
}
/* Mausknöpfe oder ein Tastendruck? */
if( msg = GetMsg(win->UserPort) ) {
quit = TRUE;
user_quit = TRUE;
ReplyMsg( msg );
}
/* Wenn 'Change Blanker' im Hauptfenster aktiviert wurde
(duration_sec ist ungleich null) UND wir schon etwas länger
blanken als erlaubt (difftime(time(NULL),start) > time_counter)
dann müssen wir schlußmachen. */
if( duration_sec && difftime(time(NULL),start) > duration_sec )
quit = TRUE;
WaitTOF();
}
}
/* Alles Angeforderte schließen (und vielleicht einen Fehler schreiben): */
close_all();
/* Wenn unser Blanker durch den Anwender beendet wurde, müssen wir das Mad-
house mitteilen (sonst würde es [bei aktivertem Change Blanker] den
nächsten Blanker starten. */
if( user_quit )
write_stopblank();
/* Und fertig! */
}
/***************************************************************************
*** ***
*** Funktionen zur Verständigung mit Madhouse ***
*** ***
***************************************************************************/
/* Einige globale Variablen: */
char bu[1500]; /* Der Speicherbereich bu[] enthält die gesamte prefs-
Datei. */
short bu_seek = 0; /* bu_seek ist der Offset von bu[]. Er gibt an, wo sich
die "Lesemarke" in bu befindet, ab der der nächste
Parameter gelsen wird. */
/* Erstmal einige nützliche Funktionen: */
/***************************************************************************
*** read_next_digit()
*** Liest die nächste Nummer aus der prefs-Datei.
*** (Der nächste Parameter muß eine Nummer sein.)
***************************************************************************/
long read_next_digit()
{
short number_cnt = 0;
char number[50];
while( bu[bu_seek] != (char) 0x0D ) {
number[number_cnt] = bu[bu_seek];
bu_seek++;
number_cnt++;
}
number[number_cnt] = (char) 0x00;
/* Das (0x0D)(0x0A) muß übersprungen werden.
* (Madhouse schreibt diese Sequenzen zwischen die Zeilen.) */
bu_seek+=2;
return strtol( number, 0, 10 );
}
/***************************************************************************
*** read_next_string()
*** Liest die nächste Zeichenkette aus der prefs-Datei.
*** (Der nächste Parameter muß eine Zeichenkette sein.)
**************************************************************************/
void read_next_string( char *string, short maxlen )
{
short text_cnt = 0;
/* Ein Madhouse-Text beginnt aus technischen Gründen (Aha) mit "$".
Weil wir das "$" nicht benötigen, überspringen wir einfach das
nächste Zeichen. */
bu_seek++;
while( (bu[bu_seek] != (char) 0x0D) && (text_cnt < maxlen) ) {
string[text_cnt] = bu[bu_seek];
bu_seek++;
text_cnt++;
}
string[text_cnt] = (char) 0x00;
/* Jetzt haben wir den Text in string[]. */
/*
* Die (0x0D)(0x0A)-Sequenz überspringen.
*/
bu_seek+=2;
}
/***************************************************************************
*** read_prefs()
*** Liest die Einstellungen.
***************************************************************************/
void read_prefs()
{
short text_cnt = 0;
short number_cnt = 0;
BPTR f = NULL;
f = Open( "RAM:Madhouse_Storage/prefs", MODE_OLDFILE );
if (f) {
Read( f, bu, sizeof( bu ) );
/* Nun hat bu[] zum Beispiel so einen Inhalt:
"$Hello, this is a text(0x0D)(0x0A)2(0x0D)(0x0A)0(0x0D)(0x0A)
5(0x0D)(0x0A)RAM:Madhouse_Storage(0x0D)(0x0A)".
Die beiden Zeichen (0x0D) und (0x0A) sind zwischen jeder Zeile.
Hello,... ist unser erste Parameter. 2 ist der Zweite (die
Farbe des Textes), 0 der Dritte (Scrollen ja/nein), 5 ist
der Duration-Wert in Minuten und RAM:... ist der Pfad unseres
Verzeichnisses, falls wir eine Datei nachladen möchten.
Alle Madhouse-Strings beginnen mit "$".
Der erste Parameter wird in text[] verfrachtet, der Zweite kommt
in color, der Dritte in duration_sec und den Pfad brauchen wir
gar nicht. */
/*
* Erster Parameter (Text)
*/
read_next_string( text, 40 );
/*
* Zweiter Parameter (Color)
*/
color = read_next_digit();
/*
* Dritter Parameter (Scroll)
*/
scroll = read_next_digit();
/*
* Duration-Parameter.
*/
duration_sec = read_next_digit() * 60; /*Minuten -> Sekunden*/
Close( f );
} else { /* Der Blanker wurde nicht von Madhouse gestarten: Abbruch! */
exit(0);
}
}
/***************************************************************************
*** write_stopblank()
*** Muß benutzt werden, wenn der Blanker durch den Anwender abgebrochen
*** wurde, und nicht durch den Duration-Wert.
***************************************************************************/
void write_stopblank()
{
/* Wir müssen nur eine neue, leere Datei anlegen, schon weiß Madhouse
bescheit. */
BPTR f;
f = Open( "RAM:Madhouse_Storage/stopblank", MODE_NEWFILE );
if( f )
Close( f );
}
/***************************************************************************
*** write_error()
*** Macht Madhouse klar, daß ein Fehler auftrat (und wie der Fehler
*** heißt) - darf nur EINMAL aufgerufen werden!
***************************************************************************/
void write_error( char *str )
{
BPTR f;
char eol_marker = 0x0D;
f = Open( "RAM:Madhouse_Storage/errors", MODE_READWRITE );
if( f ) {
Seek( f, 0, OFFSET_END );
Write( f, str, strlen(str) );
Write( f, &eol_marker, 1 );
Close( f );
}
}